package com.shoping.web.component.other;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.context.annotation.Configuration;

/**
 * 一般情况下，Spring 通过反射机制利用 service 的 class 属性指定支线类去实例化 service，在某些情况下，实例化 Bean 过程比较复杂，
 * 如果按照传统的方式，则需要在 service 中提供大量的配置信息。配置方式的灵活性是受限的，这时采用编码的方式可能会得到一个简单的方案。
 * Spring 为此提供了一个org.springframework.service.factory.FactoryBean的工厂类接口，用户可以通过实现该接口定制实例化 Bean 的逻辑。
 * FactoryBean接口对于 Spring 框架来说占用重要的地位，Spring 自身就提供了 70 多个FactoryBean的实现。它们隐藏了实例化一些复杂 service
 * 的细节，给上层应用带来了便利。从 Spring3.0 开始，FactoryBean开始支持泛型，即接口声明改为FactoryBean<T>的形式
 * <p>
 * 使用场景：用户可以扩展这个类，来为要实例化的 service 作一个代理，比如为该对象的所有的方法作一个拦截，在调用前后输出一行 log，
 * 模仿ProxyFactoryBean的功能
 */
@Slf4j
@Configuration
public class MyFactoryBean implements FactoryBean<MyFactoryBean.TestFactoryInnerBean> {

    private static int count = 0;

    @Override
    public TestFactoryInnerBean getObject() throws Exception {
        log.info("-----测试1 【FactoryBean】 getObject");
        return new TestFactoryInnerBean();
    }

    @Override
    public Class<?> getObjectType() {
        
        return TestFactoryInnerBean.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

    public static class TestFactoryInnerBean {

    }
}
